import 'dart:async';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class DownTimerView extends StatefulWidget{

  /// 倒计时的秒数，默认60秒。
  final int countdown;
  /// 用户点击时的回调函数。
  final Function onTapCallback;
  /// 倒计时结束的回调函数。
  final Function onEndTimeCallback;
  /// 是否可以获取验证码，默认为`false`。
  final bool available;
  final bool cutDownEnable;

  DownTimerView({
    this.countdown: 60,
    this.onTapCallback,
    this.onEndTimeCallback,
    this.available: false,
    this.cutDownEnable:false,
  });

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return DownTimerViewState();
  }

}

/// 墨水瓶（`InkWell`）可用时使用的字体样式。
final TextStyle _availableStyle = TextStyle(
  fontSize: 14.0,
  color: const Color(0xFF00CACE),
);

/// 墨水瓶（`InkWell`）不可用时使用的样式。
final TextStyle _unavailableStyle = TextStyle(
  fontSize: 14.0,
  color: const Color(0xFFCCCCCC),
);

class DownTimerViewState extends State<DownTimerView> {


  /// 倒计时的计时器。
  Timer _timer;
  /// 当前倒计时的秒数。
  int _seconds;
  /// 当前墨水瓶（`InkWell`）的字体样式。
  TextStyle inkWellStyle = _availableStyle;
  /// 当前墨水瓶（`InkWell`）的文本。
  String _verifyStr = '获取验证码';

  @override
  void initState() {
    super.initState();
    _seconds = widget.countdown;
  }

  @override
  Widget build(BuildContext context) {
    if(widget.available && _seconds == widget.countdown && widget.cutDownEnable){
      _startTimer();
      inkWellStyle = _unavailableStyle;
      _verifyStr = '$_seconds'+'s';
      //setState(() {});
    }
    // 墨水瓶（`InkWell`）组件，响应触摸的矩形区域。
    return widget.available ? InkWell(
      child: Text('  $_verifyStr  ',style: inkWellStyle,),
      onTap: (_seconds == widget.countdown) ? () {
        widget.onTapCallback();
      } : null,
    ): InkWell(
      child: Text(
        '  获取验证码  ',
        style: _unavailableStyle,
      ),
    );
  }

  /// 启动倒计时的计时器。
  void _startTimer() {
    // 计时器（`Timer`）组件的定期（`periodic`）构造函数，创建一个新的重复计时器。
    _cancelTimer();
    _timer = Timer.periodic(
        Duration(seconds: 1),
            (timer) {
          _seconds--;
          _verifyStr = '$_seconds'+'s';
          if (_seconds == 0) {
            _cancelTimer();
            _seconds = widget.countdown;
            inkWellStyle = _availableStyle;
            _verifyStr = '重新发送';
            if(widget.onEndTimeCallback != null){
              widget.onEndTimeCallback();
            }
          }else{
            if(mounted){
              setState(() {});
            }
          }
        });
  }

  /// 取消倒计时的计时器。
  void _cancelTimer() {
    // 计时器（`Timer`）组件的取消（`cancel`）方法，取消计时器。
    _timer?.cancel();
  }

  @override
  void dispose() {
    // TODO: implement dispose
    _cancelTimer();
    super.dispose();
  }

}